package com.bit.cfdi.web.vm.negocio;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.zkoss.image.Image;

import com.bit.cfdi.web.constants.NavInfrastructure;
import com.bit.cfdi.web.domain.ModulosUsuario;
import com.bit.cfdi.web.domain.Negocio;
import com.bit.cfdi.web.domain.Usuario;
import com.bit.cfdi.web.domain.UsuarioNegocio;
import com.bit.cfdi.web.services.UsuarioNegocioService;
import com.bit.cfdi.web.utils.ByteUtils;
import com.bit.cfdi.web.utils.ImageUtils;

public class NegocioViewParser {
	
	private Logger log = LogManager.getLogger(this.getClass().getName());
	
	private UsuarioNegocioService usuarioNegocioService;
	private static final String UNNAMED_BUSINESS = "Negocio sin nombre";
	private static final String DEFAULT_BUSINESS_IMAGE = "negocio/default_business.png";
	private static final String CSD_IMAGE = "negocio/csd.png";
	private static final String KEY_IMAGE = "negocio/llave.png";
	private static final String CROWN_IMAGE = "negocio/owner.png";

	private Negocio negocio;
	private String nombre;
	private List<String> permisos;
	private Image imagen;
	private Image csdImage;
	private Image keyImage;
	private Image crownImage;
	
	public NegocioViewParser(final Negocio negocio, final Usuario usuario,
			final UsuarioNegocioService usuarioNegocioService) {
		this.usuarioNegocioService = usuarioNegocioService;
		this.negocio = negocio;
		nombre = negocio.getNombre();
		if(nombre == null || nombre.trim().isEmpty()) {
			nombre = UNNAMED_BUSINESS;
		}
		permisos = getPermisos(usuario);
		getImagenDeNegocio();
		createCSDImage();
		createKeyImage();
		createCrownImage();
	}
	
	public Negocio getNegocio() {
		return negocio;
	}
	
	public String getNombre() {
		return nombre;
	}
	
	public List<String> getPermisos() {
		return permisos;
	}
	
	public Image getImagen() {
		return imagen;
	}
	
	public Image getCsdImage() {
		return csdImage;
	}
	
	public Image getKeyImage() {
		return keyImage;
	}
	
	public Image getCrownImage() {
		return crownImage;
	}
	
	private List<String> getPermisos(final Usuario usuario) {
		
		List<String> permisos = new ArrayList<String>();
		UsuarioNegocio usuarioNegocioRelation = usuarioNegocioService
				.getUsuarioNegocio(usuario, negocio);
		for(ModulosUsuario currentModuloUsuario : 
				usuarioNegocioRelation.getAccesos()) {
			permisos.add(currentModuloUsuario.getNombreModulo());
		}
		return permisos;
	}
	
	private void getImagenDeNegocio() {
		if(negocio.getLogoNegocio()!=null) {
			try {
				imagen = ImageUtils.scaleToSize(ByteUtils.toByteNative(
						negocio.getLogoNegocio()), 170, 85, 
						negocio.getFormatoLogo()).getContent();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		else {
			try {
				imagen = ImageUtils.getImageFromClassResource(
						DEFAULT_BUSINESS_IMAGE);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void createCSDImage() {
		if(negocio.getNegCer()==null) {
			return;
		}
		try {
			csdImage = ImageUtils.getImageFromClassResource(CSD_IMAGE);
		} catch (IOException e) {
			log.error("ERROR: creating CSD image "+CSD_IMAGE);
		}
	}
	
	private void createKeyImage() {
		if(negocio.getNegKey()==null) {
			return;
		}
		try {
			keyImage = ImageUtils.getImageFromClassResource(KEY_IMAGE);
		} catch (IOException e) {
			log.error("ERROR: creating KEY image "+KEY_IMAGE);
		}
	}
	
	private void createCrownImage() {
		if(!permisos.contains(NavInfrastructure.KEY_KING_NEGOCIO)) {
			return;
		}
		try {
			crownImage = ImageUtils.getImageFromClassResource(CROWN_IMAGE);
		} catch (IOException e) {
			log.error("ERROR: creating CROWN image "+CROWN_IMAGE);
		}
	}
}
